package com.iswust.mianzhoutong.sign.service;

import com.iswust.mianzhoutong.sign.exception.ApiException;
import com.iswust.mianzhoutong.sign.model.dto.SignResult;
import com.iswust.mianzhoutong.sign.model.dto.SignDaysDetailDto;
import com.iswust.mianzhoutong.sign.model.dto.SignSummaryDto;
import com.sun.istack.internal.NotNull;

import java.util.Date;
import java.util.List;

/**
 * @author liushuai
 * @create 2022-07-14 17:22
 */

public interface SignService {


    /**
     * 得到该月签到的统计数据
     * @param userId     用户id
     * @return 返回某月累计签到数据,详见:{@link SignSummaryDto}
     */
     @NotNull  SignSummaryDto getSignMonthSummary(@NotNull Integer userId) ;

    /**
     * 执行签到
     * @param userId 用户id
     * @return 返回签到结果.详见{} {@link SignResult
     * @throws 接口异常
     */
    @NotNull  SignResult doSign(Integer userId) throws ApiException;

    /**
     * 执行补签
     * @param userId 用户id
     * @param date   补签返回结果.
     * @return 返回用户本月签到统计数据 详见{@link SignResult}
     * @ throws  接口异常
     */
    @NotNull  SignResult doReSign(Integer userId, Date date) throws ApiException;

    /**
     * 查询某日是否签到
     *
     * @param userId 用户标识id
     * @param date   签到的日期
     * @return true:已签到,false:未签到
     */

    @NotNull Boolean isSign(@NotNull Integer userId, @NotNull Date date);

    /**
     * 查询用户某月每日签到详情
     *
     * @param yearMonth   要查询的年月,格式 yyyy-MM
     * @param userId 用户id
     * @return 某月每一天的奖励类型, 签到类型,详情{@link SignDaysDetailDto}
     */
    @NotNull List<SignDaysDetailDto> getSignDaysDetails(Integer userId, String yearMonth) throws ApiException;


}
